// 双指针：1. 设置快慢两个指针，快慢两个指针一起移动，使得两指针之间一直保持 n 个节点
// 当指针到达链表底了，将慢节点的指针指向它的下一个节点，即为要删除的节点
// 当要删除的节点是 head 时，需要设置哨兵节点，即增设一个位于当前头部节点的前一个值为 null 的哨兵
// 节点，最后返回哨兵节点的 next 即为所求
var removeNthFromEnd = function (head, n) {
  let pre = new ListNode(0);
  pre.next = head;
  let start = pre,
    end = pre;
  while (n--) {
    start = start.next;
  }
  while (start.next !== null) {
    start = start.next;
    end = end.next;
  }
  end.next = end.next.next;
  return pre.next;
};
